# JWT配置
import os
from datetime import timedelta
from dotenv import load_dotenv, find_dotenv

# 查找并加载环境变量
env_file = find_dotenv()
load_dotenv(env_file)

from app.utils.crypto_utils import CryptoUtils

class JWTConfig:
    """JWT配置类"""
    
    # JWT密钥配置
    # 可以使用以下方法之一来生成密钥：
    # 1. 从环境变量获取
    # 2. 使用CryptoUtils生成随机密钥
    # 3. 使用CryptoUtils生成基于哈希的密钥
    
    # 示例：使用CryptoUtils生成JWT密钥
    # SECRET_KEY = CryptoUtils.generate_jwt_secret('random', 32)  # 随机密钥
    # SECRET_KEY = CryptoUtils.generate_jwt_secret('hex', 32)     # 十六进制密钥
    # SECRET_KEY = CryptoUtils.generate_jwt_secret('sha256')       # 基于SHA256的密钥
    
    # 默认配置：优先从环境变量获取，否则使用固定的默认密钥
    # 注意：在生产环境中，强烈建议通过环境变量设置SECRET_KEY
    # 如果未设置环境变量，应用将使用以下默认密钥
    SECRET_KEY = os.environ.get('JWT_SECRET_KEY') or os.environ.get('SECRET_KEY') or "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"
    
    # JWT算法
    JWT_ALGORITHM = 'HS256'
    
    # JWT过期时间（小时）
    JWT_EXPIRATION_HOURS = 24
    
    # JWT签发者
    JWT_ISSUER = 'FlaskApp'
    
    # 是否在Cookie中存储JWT
    JWT_COOKIE_SECURE = False  # 生产环境应设为True（仅HTTPS）
    JWT_COOKIE_HTTPONLY = True
    JWT_COOKIE_CSRF_PROTECT = True
    
    # JWT访问令牌过期时间
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1)
    
    # JWT刷新令牌过期时间
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)
    
    # 是否在响应头中返回JWT
    JWT_HEADER_TYPE = 'Bearer'
    
    @classmethod
    def generate_new_secret(cls, algorithm='random', length=32):
        """
        生成新的JWT密钥
        
        Args:
            algorithm: 生成算法，支持random, hex, base64, md5, sha1, sha256, sha512
            length: 密钥长度，适用于random, hex, base64算法
            
        Returns:
            新的JWT密钥字符串
        """
        return CryptoUtils.generate_jwt_secret(algorithm, length)
    
    @classmethod
    def update_secret_key(cls, new_secret):
        """
        更新JWT密钥
        
        Args:
            new_secret: 新的密钥
            
        Returns:
            更新后的密钥
        """
        cls.SECRET_KEY = new_secret
        return cls.SECRET_KEY